#ifndef HEAPSORT_H
#define HEAPSORT_H

#include <cstddef>  //Para usar "size_t".
#include <cstring>  //Para usar "memcpy".
#include <iostream>
using namespace std;

typedef unsigned char byte;

class Heapsort
{
    private:
        /// Atributos: ///
        size_t tamanho_vetor;
        size_t tamanho_elemento;
        void* vetor;
        int(*funcao_comparacao)(const void*,const void*);

        /// Métodos: ///
        //size_t pai(size_t i){if(i==0) return(0);return((i-1)/2);}
        size_t filho_esquerdo(size_t i){return(2*i+1);}      ///ok!
        size_t filho_direito(size_t i){return(2*i+2);}       ///ok!
        void* get(size_t posicao);                           ///ok!
        void trocar(size_t primeiro, size_t segundo);        ///ok!
        void max_heapify(size_t i, size_t tamanho_heap);     ///ok!
        void build_max_heap();                               ///ok!

    public:
        Heapsort();                                          ///ok!
        Heapsort(void* vetor,                                ///ok!
                 size_t tamanho_vetor,
                 size_t tamanho_elemento,
                 int(*comparador)(const void*,const void*));
        ~Heapsort();                                         ///ok!
        void heapsort();                                     ///ok!
        void heapsort(void* vetor,                           ///ok!
                      size_t tamanho_vetor,
                      size_t tamanho_elemento,
                      int(*comparador)(const void*,const void*));
};

#endif // HEAPSORT_H
